package com.jvm.synchronizedp;

public class Demo1 {

    static int num = 0;

    public static void m1() {
        for (int i = 0; i < 10000; i++) {
            num++;
        }
    }

    /**
     *
     * 关键字 synchronized 可以保证在同一个时刻，
     * 只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作)
     *
     * 另外一个重要的作用，synchronized 可保证一个线程的变化(主要是共享数据的变化)
     * 被其他线程所看到（保证可见性，完全可以替代 volatile 功能）
     */
    public static synchronized void m2() {
        for (int i = 0; i < 10000; i++) {
            num++;
        }
    }

    public static class T1 extends Thread {

        @Override
        public void run() {
//            Demo1.m1();
            Demo1.m2();
        }
    }


    public static void main(String[] args) throws InterruptedException {
        T1 t1 = new T1();
        T1 t2 = new T1();
        T1 t3 = new T1();

        t1.start();
        t2.start();
        t3.start();

        // 等待3个线程结束打印num
        t1.join();
        t2.join();
        t3.join();

        System.out.println(Demo1.num);
        /**
         * 调用 m1() 打印结果：非线程安全
         *      26035
         * 调用 m1() 打印结果：线程安全
         *      30000
         *
         */
    }

}
